#pragma once

#include <string>
#include <stdexcept>
#include <ctime>
#include <cstdlib>

namespace WD {
namespace utils {

/**
 * @brief 将 UTC 字符串（例如 "2025-06-25T09:51:02.12345"）解析为 double 类型时间戳（单位秒）
 * @param datetime_str 格式应为 "YYYY-MM-DDTHH:MM:SS.ffffff"
 * @return UTC 时间戳（自1970年起的秒数，带小数）
 */
inline double parseUtcToSec(const std::string& datetime_str) {
    std::tm tm = {};
    
    // 使用 strptime 解析年月日和时分秒部分
    char* ret = strptime(datetime_str.c_str(), "%Y-%m-%dT%H:%M:%S", &tm);
    if (!ret) {
        throw std::runtime_error("Failed to parse datetime: " + datetime_str);
    }

    // 转换为 time_t（秒数），注意 timegm 用于 UTC 时间（非 localtime）
    time_t base_seconds = timegm(&tm);  // 注意：timegm 是 GNU 扩展，确保在 Linux 编译环境

    // 提取小数部分（如 .12345）
    double fractional_seconds = 0.0;
    size_t dot_pos = datetime_str.find('.');
    if (dot_pos != std::string::npos) {
        std::string fractional = datetime_str.substr(dot_pos + 1);
        try {
            fractional_seconds = std::stod("0." + fractional);
        } catch (...) {
            throw std::runtime_error("Failed to parse fractional seconds in datetime: " + datetime_str);
        }
    }

    return static_cast<double>(base_seconds) + fractional_seconds;
}

}  // namespace utils
}  // namespace WD
